package co.edu.udea.iw.ws;

import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import co.edu.udea.iw.dao.DispositivoDAO;
import co.edu.udea.iw.dao.PrestamoDAO;
import co.edu.udea.iw.dao.SolicitudDAO;
import co.edu.udea.iw.dao.UsuarioDAO;
import co.edu.udea.iw.dto.Dispositivo;
import co.edu.udea.iw.dto.Prestamo;
import co.edu.udea.iw.dto.Solicitud;
import co.edu.udea.iw.dto.SolicitudWS;
import co.edu.udea.iw.dto.TipoDocumento;
import co.edu.udea.iw.dto.Usuario;
import co.edu.udea.iw.exception.IWDaoException;

/**
 * Clase cuyo objetivo es realizar los servicios web para Solicitud
 * 
 * @author Santiago Ruiz
 * @author Bladimir Velez
 *
 */
@Component
@Path("Solicitud")
public class ServicioWebSolicitud {

	@Autowired
	private DispositivoDAO dispositivoDAO;

	@Autowired
	private SolicitudDAO solicitudDAO;

	@Autowired
	private PrestamoDAO prestamoDAO;

	@Autowired
	private UsuarioDAO usuarioDao;

	/**
	 * Servicio que crea una solicitud
	 * 
	 * @param idSolicitud
	 *            Id de la solicitud
	 * @param fecha1
	 *            Fecha de la solicitud
	 * @param fecha2
	 *            Fecha en la cual se desea realizar el prestamo
	 * @param horaInicio
	 *            Hora en la cual se desea iniciar el prestamo
	 * @param horaFin
	 *            Hora en la cual se desea finalizar el prestamo
	 * @param cantidad
	 *            cantidad de dispositivos que se desea prestar
	 * @param numDocumento
	 *            Numero de documento del usuario que realiza la solicitud
	 * @param tipo
	 *            Tipo del documento del usuario que realiza la solicitud
	 * @param idDispositivo
	 *            Id del dispositivo que se desea prestar
	 * @return
	 */
	@Produces(MediaType.TEXT_PLAIN)
	@GET
	@Path("RealizarSolicitud")
	public String RealizarSolicitud(@QueryParam("fechaS") String fecha1,
			@QueryParam("fechaP") String fecha2,
			@QueryParam("HoraI") Time horaInicio,
			@QueryParam("HoraF") Time horaFin,
			@QueryParam("Cantidad") int cantidad,
			@QueryParam("NumD") int numDocumento,
			@QueryParam("TipoD") String tipo,
			@QueryParam("IdDisp") int idDispositivo) {
		Random rnd = new Random();
		int idSolicitud = (int) (rnd.nextDouble() * 100000 + 100);
		Solicitud solicitud;
		Dispositivo dispositivo;
		Usuario usuario;
		SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
		Date fechaSolicitud = null;
		Date fechaPrestamo = null;
		try {
			fechaSolicitud = formatoDelTexto.parse(fecha1);
			fechaPrestamo = formatoDelTexto.parse(fecha2);
		} catch (Exception ex) {
			ex.printStackTrace();

		}
		try {
			usuario = usuarioDao.obtenerUsuario(numDocumento,
					new TipoDocumento(tipo, ""));
			dispositivo = dispositivoDAO.obtenerDispositivo(idDispositivo);
			solicitud = new Solicitud(idSolicitud, fechaSolicitud,
					fechaPrestamo, horaInicio, horaFin, cantidad, usuario,
					dispositivo);
			solicitudDAO.agregarSolicitud(solicitud);
			return (" La solicitud " + idSolicitud + " del usuario "
					+ solicitud.getUsuario().getNombre() + " "
					+ solicitud.getUsuario().getApellido() + " ha sido creada satisfactoriamente");

		} catch (IWDaoException e) {
			Logger log = Logger.getLogger(Exception.class);
			log.error("Error realizando la solicitud");
			return ("Error realizando la solicitud");
		}

	}

	/**
	 * Servicio para aprobar o rechazar una solicitud Cuando se aprueba una
	 * solicitud esta pasa a ser creada como un prestamo y se elimina como
	 * solicitud si se rechaza esta es eliminada.
	 * 
	 * @param idSolicitud
	 *            Id de la solicitud que se desea aprobar o rechazar
	 * @param aprobado
	 *            Campo booleano donde se especifica si se aprovo o rechazo la
	 *            solicitud
	 * @return
	 */
	@Produces(MediaType.TEXT_PLAIN)
	@GET
	public String aprobarSolicitud(@QueryParam("id") int idSolicitud,
			@QueryParam("aprobado") boolean aprobado) {
		Solicitud solicitud;
		try {
			solicitud = solicitudDAO.obtenerSolicitud(idSolicitud);
			Random rnd = new Random();
			int num = (int) (rnd.nextDouble() * 100000 + 100);
			if (aprobado) {
				Prestamo prestamo = new Prestamo(num,
						solicitud.getFechaPrestamo(),
						solicitud.getHoraInicioPrestamo(),
						solicitud.getHoraFinPrestamo(), null,
						solicitud.getCantidad(), null, solicitud.getUsuario(),
						solicitud.getIdDispositivo());
				prestamoDAO.agregarPrestamo(prestamo);
				solicitudDAO.eliminarSolicitud(solicitud);
				return (" La solicitud " + idSolicitud + " del usuario "
						+ solicitud.getUsuario().getNombre() + " "
						+ solicitud.getUsuario().getApellido() + " ha sido Aprobado");
			} else {
				solicitudDAO.eliminarSolicitud(solicitud);
				return (" La solicitud " + idSolicitud + " del usuario "
						+ solicitud.getUsuario().getNombre() + " "
						+ solicitud.getUsuario().getApellido() + " ha sido rechazada");
			}

		} catch (IWDaoException e) {

			Logger log = Logger.getLogger(Exception.class);
			log.error("Error aprobando/rechazando la solicitud");
			return ("Error aprobando/rechazando la solicitud");
		}

	}

	@Produces(MediaType.APPLICATION_JSON)
	@GET
	@Path("ConsultarSolicitudes")
	public List<SolicitudWS> consultarSolicitudes() {

		List<SolicitudWS> Slicitudes = new ArrayList<SolicitudWS>();
		try {
			List<Solicitud> solicitudes = solicitudDAO.obtenerSolicitudes();
			for (Solicitud s : solicitudes) {
				Slicitudes.add(new SolicitudWS(s.getIdSolicitud(), s
						.getFechaSolicitud(), s.getFechaPrestamo(), s
						.getHoraInicioPrestamo().toString(), s
						.getHoraFinPrestamo().toString(), s.getCantidad(), s
						.getUsuario(), s.getIdDispositivo()));

			}
		} catch (IWDaoException e) {

			Logger log = Logger.getLogger(Exception.class);
			log.error("Error obteniendo los datos");
		}

		return Slicitudes;
	}

}
